iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
自我挑戰組

C# 和 SQL 探索之路 - 3系列 第 12

Day 12: C# 實作單例模式

  • 分享至 

  • xImage
  •  

單例模式 (Singleton Pattern) 可建立程式執行時的唯一物件。其特色包含:

  • 該類別在程式執行期間,只容許一個 Instance (實例) 存在。

  • 須包含檢查 Instance 是否存在的程式、產生 Instance 的程式,以及提供 Public 方法供外部程式存取 Instance。

  • 優點:和 Static Class 相比,保留較多的特性,如:可被封裝與繼承,可被動態產生等。

  • 缺點:等於是全域變數。在任何類別都能存取 Instance。當發生錯誤時,不容易找出是哪一次的存取導致的;無法保證每次執行同樣方法時,都取得同樣的回傳值。

在 C# 中實作要注意的事項

  • 建構子使用 private,因此若有類別欲繼承,將會在編譯時發生錯誤。
  • 若將繼承的類別放置於原有的類別內,成為一個巢狀類別,則可能導致多個 Instance 產生。因此使用 sealed 限制該類別不能被繼承。

範例

///<summary> 單例模式類別 </summary>
public sealed class Singleton // 使用 sealed 關鍵字表示不能被繼承
{
    private static Singleton instance = null;
    public static Singleton Instance 
    {
        get 
        {
            if (instance == null) 
            {
                instance = new Singleton(); // 第一次被 get 時,才建立物件
            }
            return instance; // 之後直接回傳先前建立的物件
        }
    }
    // NOTE: 如果在多執行緒的狀態下使用單例類別,要在取得 Instance 時,加入 lock 檢查
    
    private Singleton() { } // 宣告私有建構子,強迫外部程式使用 Instance

    public void Run()
    {
        Console.WriteLine("Singleton Class");
    }
}

參考資料


上一篇
Day 11: C# 實作表象模式
下一篇
Day 13: C# 單元測試入門
系列文
C# 和 SQL 探索之路 - 330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言